package thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

//Java 标准库线程池的创建方式
public class demo15 {
    public static void main(String[] args) throws InterruptedException {
        // 第一种：创建一个固定线程数量的线程池
        // 当线程池中的任务数 超过 可存放的最大任务数，会进入阻塞等待
//        ExecutorService service = Executors.newFixedThreadPool(5);
//        for (int i = 0; i < 10; i++) {
//            int id = i;
//            service.submit(() -> {
//                System.out.println("i = " + id);
//            });
//        }

//        // 第二种：创建一个 线程数目动态变化的 线程池
//        // 当线程池中的任务数 较少时，会适当的销毁线程；当待执行的任务数较多时， 会适当地创建更多 新的线程以执行任务
//        ExecutorService service1 = Executors.newCachedThreadPool();
//        for (int i = 0; i < 50; i++) {
//            int id = i;
//            service1.submit(() -> {
//                System.out.println("i = " + id);
//            });
//        }

        // 第三种： 创建一个 只有一个线程 执行线程任务的线程池
        // 线程池每次只能执行 一个线程任务， 多余的任务会在任务队列中等待执行
//        ExecutorService service2 = Executors.newSingleThreadExecutor();
//        for (int i = 0; i < 50; i++) {
//            int id = i;
//            service2.submit(() -> {
//                System.out.println("i = " + id);
//            });
//        }

        // 第四种： 创建一个支持 定时或周期性 执行任务队列中任务的 指定核心线程数的线程池
//        ScheduledExecutorService service = Executors.newScheduledThreadPool(5);
//        for (int i = 0; i < 10; i++) {
//            int id = i;
//            service.schedule(() -> {
//                System.out.println("i = " + id);
//            }, i * 1000, TimeUnit.MILLISECONDS);
//        }

        // 第五种： 创建一个支持 定时或周期性 执行任务队列中任务的 单线程线程池
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.submit(()-> {
            System.out.println("这是一个正常的线程任务");
        });
        service.scheduleWithFixedDelay(() -> {
            System.out.println("这是一个周期性任务， 将在任务结束后每隔3秒执行一次");
        }, 1000, 4000, TimeUnit.MILLISECONDS);

    }

}
